package br.com.aquinoevasconcelos.fachada;

import java.text.ParseException;
import java.util.List;








import br.com.aquinoevasconcelos.control.ControladorADM;
import br.com.aquinoevasconcelos.control.ControladorAgendamento;
import br.com.aquinoevasconcelos.control.ControladorArquivo;
import br.com.aquinoevasconcelos.control.ControladorCliente;
import br.com.aquinoevasconcelos.control.ControladorContato;
import br.com.aquinoevasconcelos.control.ControladorInformativo;
import br.com.aquinoevasconcelos.control.ControladorMensagem;
import br.com.aquinoevasconcelos.control.ControladorModeloContrato;
import br.com.aquinoevasconcelos.control.ControladorOrcamento;
import br.com.aquinoevasconcelos.excecao.EmailException;
import br.com.aquinoevasconcelos.excecao.ObjNaoEncontradoException;
import br.com.aquinoevasconcelos.excecao.ValidacaoException;
import br.com.aquinoevasconcelos.modelos.Agendamento;
import br.com.aquinoevasconcelos.modelos.Arquivo;
import br.com.aquinoevasconcelos.modelos.Contato;
import br.com.aquinoevasconcelos.modelos.Informativo;
import br.com.aquinoevasconcelos.modelos.Mensagem;
import br.com.aquinoevasconcelos.modelos.ModeloContrato;
import br.com.aquinoevasconcelos.modelos.Orcamento;
import br.com.aquinoevasconcelos.repositorio.RepositorioADM;
import br.com.aquinoevasconcelos.repositorio.RepositorioAgendamento;
import br.com.aquinoevasconcelos.repositorio.RepositorioArquivo;
import br.com.aquinoevasconcelos.repositorio.RepositorioCliente;
import br.com.aquinoevasconcelos.repositorio.RepositorioContato;
import br.com.aquinoevasconcelos.repositorio.RepositorioInformativo;
import br.com.aquinoevasconcelos.repositorio.RepositorioMensagem;
import br.com.aquinoevasconcelos.repositorio.RepositorioModeloContrato;
import br.com.aquinoevasconcelos.repositorio.RepositorioOrcamento;
import br.com.aquinoevasconcelos.user.UsuarioAdm;
import br.com.aquinoevasconcelos.user.UsuarioCliente;

/**
 * @author Paulo Roberto
 * @email paulolima2008@hotmail.com
 * @version 1.0 @ Propriedade da Techcode
 */

public class Fachada {

	private static Fachada instancia;

	// Instancia do Controladores
	private ControladorContato contatos;
	private ControladorInformativo informativo;
	private ControladorAgendamento agendar;
	private ControladorModeloContrato modelContrato;
	private ControladorCliente cliente;
	private ControladorADM administrador;
	private ControladorArquivo arquivos;
	private ControladorOrcamento orcamentos;
	private ControladorMensagem mensagens;

	// Iniciado todos os Repositorios
	private void initControlador() {

		RepositorioContato rc = new RepositorioContato();
		contatos = new ControladorContato(rc);

		RepositorioInformativo ri = new RepositorioInformativo();
		informativo = new ControladorInformativo(ri);

		RepositorioAgendamento ra = new RepositorioAgendamento();
		agendar = new ControladorAgendamento(ra);

		RepositorioModeloContrato rmc = new RepositorioModeloContrato();
		modelContrato = new ControladorModeloContrato(rmc);

		RepositorioCliente ruc = new RepositorioCliente();
		cliente = new ControladorCliente(ruc);

		RepositorioADM rua = new RepositorioADM();
		administrador = new ControladorADM(rua);

		RepositorioArquivo rar = new RepositorioArquivo();
		arquivos = new ControladorArquivo(rar);

		RepositorioOrcamento ro = new RepositorioOrcamento();
		orcamentos = new ControladorOrcamento(ro);

		RepositorioMensagem rm = new RepositorioMensagem();
		mensagens = new ControladorMensagem(rm);
	}

	// Construtor da Classe que iniciar os Repositorios
	private Fachada() {
		initControlador();
	}

	// instaciando apenas uma Fachada
	public static Fachada getInstancia() {
		if (instancia == null) {
			instancia = new Fachada();
		}
		return instancia;
	}

	// ------------------------------------------------------------------------------
	// Metodos de Contato

	public void inserirContato(Contato contato) throws ValidacaoException {
		contatos.inserirContato(contato);
	}

	public void removerContato(Contato contato) {
		contatos.removerContato(contato);
	}

	public List<Contato> listaContato() {
		return contatos.listaContato();
	}

	public List<Contato> pesquisaContato(String query) {
		return contatos.pesquisarContato(query);
	}

	public void RespostaContato(String nome, String titulo, String mensagem,
			String msgResposta, String emailDestinatario) throws EmailException {
		contatos.RespostaContato(nome, titulo, mensagem, msgResposta,
				emailDestinatario);
	}
	public Contato editarContato(long id){
		return contatos.editarContato(id);
	}

	// ------------------------------------------------------------------------------
	// Metodos Informativo
	public void inserirInformativo(Informativo info) throws ValidacaoException {
		informativo.inserirInformativo(info);

	}

	public void atualizarInformativo(Informativo info)
			throws ValidacaoException {
		informativo.atualizarInformativo(info);
	}

	public void removerInformativo(Informativo info) {
		informativo.removerInformativo(info);
	}

	public List<Informativo> listaInformativo() {
		return informativo.listaInformativo();
	}

	public List<Informativo> pesquisaInformativo(String query) {
		return informativo.pesquisaInformativo(query);
	}

	public Informativo EditarInformativo(long id){
		return informativo.EditarInformativo(id);
	}
	
	public long QuantidadeInformativo(){
		return informativo.QuantidadeInformativo();
	}
	// -------------------------------------------------------------------------------
	// Metodo de Agendamento
	public void inserirAgendamento(Agendamento agendamento)
			throws ValidacaoException, ParseException {
		agendar.inserirAgendamento(agendamento);
	}


	public void removerAgendamento(Agendamento agendamento, String nome, String msgResposta,
			String emailDestinatario,String data, String hora) {
		agendar.removerAgendamento(agendamento, nome, msgResposta, emailDestinatario, data, hora);
		}

	public List<Agendamento> listaAgendamento() {
		return agendar.listaAgendamento();
	}

	public List<Agendamento> verificarAgendamento(String query) {
		return agendar.verificarAgendamento(query);
	}

	// --------------------------------------------------------------------------

	// Metodos ModeloContrato
	public void inserirModeloContato(ModeloContrato modeloContrato)
			throws ValidacaoException {
		modelContrato.inserirModeloContato(modeloContrato);
	}

	public void atualizarModeloContrato(ModeloContrato modeloContrato)
			throws ValidacaoException {
		modelContrato.atualizarModeloContrato(modeloContrato);
	}

	public void removerModeloContrato(ModeloContrato modeloContrato) {
		modelContrato.removerModeloContrato(modeloContrato);
	}

	public List<ModeloContrato> verificarExistencia(String query) {
		return modelContrato.verificarExistencia(query);
	}

	public List<ModeloContrato> listaModeloContrato() {
		return modelContrato.listaModeloContrato();
	}

	// --------------------------------------------------------------------------------

	// Metodo Cliente
	public void inserirCliente(UsuarioCliente usuarioCliente) {
		cliente.inserirCliente(usuarioCliente);
	}

	public void atualizarCliente(UsuarioCliente usuariocliente) {
		cliente.atualizarCliente(usuariocliente);
	}

	public void removerCliente(UsuarioCliente usuarioCliente) {
		cliente.removerCliente(usuarioCliente);
	}

	public List<UsuarioCliente> pesquisaCliente(String query) {
		return cliente.pesquisaCliente(query);
	}

	public List<UsuarioCliente> listaCliente() {
		return cliente.listaCliente();
	}
	public UsuarioCliente AunteticacaoCliente(String login, String senha)
			throws ObjNaoEncontradoException {
		return cliente.AunteticacaoCliente(login, senha);
	}
	public void recuperarSenha(String login){
		cliente.recuperarSenha(login);
	}
	
	public boolean validaLogin(String login){
		return cliente.validaLogin(login);
	}
	public UsuarioCliente editarCliente(long id) {
		return cliente.editarCliente(id);
	}
	public boolean verificarEmailRecuperacaodeSenha(String email){
		return cliente.verificarEmailRecuperacaodeSenha(email);
	}

	// ---------------------------------------------------------------------------------

	// Metodo Administrador
	public void inserirADM(UsuarioAdm adm) {
		administrador.inserirADM(adm);
	}

	public void atualizarADM(UsuarioAdm adm) {
		administrador.atualizarADM(adm);
	}

	public void removerADM(UsuarioAdm adm) {
		administrador.removerADM(adm);
	}

	public List<UsuarioAdm> pesquisaADM(String query) {
		return administrador.pesquisaADM(query);
	}

	public List<UsuarioAdm> listaADM() {
		return administrador.listaADM();
	}
	public UsuarioAdm AutenticacaoADM(String login, String senha)throws ObjNaoEncontradoException {
		 return administrador.AutenticacaoADM(login, senha);
	}

	public boolean validarSenhaMestre(String senhaMestre){
		return administrador.validarSenhaMestre(senhaMestre);
	}
	
	public UsuarioAdm EditarAdministrador(long id){
		return administrador.EditarAdministrador(id);
	}
	// ---------------------------------------------------------------------------------
	// Metodo Arquivo
	public void inserirArquivo(Arquivo arquivo) {
		arquivos.inserirArquivo(arquivo);
	}

	public void atualizarArquivo(Arquivo arquivo) {
		arquivos.atualizarArquivo(arquivo);
	}

	public void removerArquivo(Arquivo arquivo) {
		arquivos.removerArquivo(arquivo);
	}

	public List<Arquivo> pesquisaArquivo(String query) {
		return arquivos.pesquisaArquivo(query);
	}

	public List<Arquivo> listaArquivo() {
		return arquivos.listaArquivo();
	}

	public List<Arquivo> listaArquivoCliente(long idCliente) {
		return arquivos.listaArquivoCliente(idCliente);
	}
	// ---------------------------------------------------------------------------------
	// Metodo Orcamento
	public void inserirOrcamento(Orcamento orcamento) {
		orcamentos.inserirOrcamento(orcamento);
	}

	public void atualizarOrcamento(Orcamento orcamento) {
		orcamentos.atualizarOrcamento(orcamento);
	}

	public void removerOrcamento(Orcamento orcamento) {
		orcamentos.removerOrcamento(orcamento);
	}

	public List<Orcamento> pesquisaOrcamento(String query) {
		return orcamentos.pesquisaOrcamento(query);
	}

	public List<Orcamento> listaOrcamento() {
		return orcamentos.listaOrcamento();
	}

	public void RespostaOrcamento(String nome, String msgResposta,
			String emailDestinatario) throws EmailException {
		orcamentos.RespostaOrcamento(nome, msgResposta, emailDestinatario);
	}
	
	public Orcamento EditarOrcamento(long id){
		return orcamentos.EditarOrcamento(id);
	}

	// ----------------------------------------------------------------------------------
	// Metado Mensagem
	public void inserirMensagem(Mensagem mensagem) {
		mensagens.inserirMensagem(mensagem);
	}

	public void removerMensagem(Mensagem mensagem) {
		mensagens.removerMensagem(mensagem);
	}

	public List<Mensagem> pesquisaMensagem(String query) {
		return mensagens.pesquisaMensagem(query);
	}

	public List<Mensagem> listaMensagemCliente() {
		return mensagens.listaMensagemCliente();
	}
	
	public Mensagem EditarMensagem(long id){
		return mensagens.EditarMensagem(id);
	}
	
	public List<Mensagem> listaMensagensCliente(long idCliente) {
		return mensagens.listaMensagensCliente(idCliente);
	}
	// ----------------------------------------------------------------------------------
}
